/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xos_net.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../helper_proc/head.h"
#include "../config/head.h"
#include "../macro/head.h"
#include "../impl/head.h"
#include "../msg/head.h"
#include "helper_net.h"

namespace xos_net
{

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    static xos_box::i_notify* net_notify_ptr = 0;
    static xos_aio::i_aio* aio_ptr = 0;

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    helper_net::helper_net()
    {
    }

    helper_net::~helper_net()
    {
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // static

    int helper_net::set_thread( xos_box::i_callback * pThread )
    {
        int ret = 0;
        get()->set_thread( pThread );
        get()->set_callback( helper_proc::on_msg );
        get()->set_msg_type( MSG_TYPE_NET );
        init_aio();
        return ret;
    }

    xos_box::i_notify* helper_net::get()
    {
        return net_notify_ptr;
    }

    xos_aio::i_aio* helper_net::aio()
    {
        return aio_ptr;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int helper_net::init_aio()
    {
        int ret = 0;

        xos_box::i_callback* pThread = get()->get_cur_thread();
        xos_aio::i_aio_mgr* pAioMgr = mgr::container()->aio();

        if( 0 == ret )
        {
            pAioMgr->set_tcp_max_post_num( config::get()->tcp_max_post_accept, config::get()->tcp_max_post_recv, config::get()->tcp_max_post_send );
            pAioMgr->set_udp_max_post_num( config::get()->udp_max_post_recv, config::get()->udp_max_post_send );
            pAioMgr->set_callback_thread( pThread );
            pAioMgr->set_msg_type( MSG_TYPE_AIO );
        }

        if( 0 == ret )
        {
            aio_ptr =pAioMgr->aio();
            aio()->set_callback( helper_proc::on_msg );
        }

        return ret;
    }

    int helper_net::init()
    {
        int ret = 0;

        xos_box::i_engine* pEngine = mgr::container()->box()->engine();

        if( 0 == ret )
        {
            ret = pEngine->create_notify( &net_notify_ptr );
        }

        return ret;
    }

    int helper_net::term()
    {
        int ret = 0;
        xos_stl::release_interface( net_notify_ptr );
        xos_stl::release_interface( aio_ptr );
        return ret;
    }

} // xos_net
